package com.jishuo.nontax.job;

import com.jishuo.base.util.GTimeUtil;
import com.jishuo.nontax.bfc.service.BankCheckBillService;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 定时任务
 * lockAtLeastFor，保留锁的最短时间。主要目的是在任务非常短的且节点之间存在时钟差异的情况下防止多个节点执行。
 * 这个属性是锁的持有时间。设置了多少就一定会持有多长时间，在此期间，下一次任务执行时，其他节点包括它本身是不会执行任务的。
 * lockAtMostFor，在执行节点死亡时应保留锁的时间。这只是一个后备，在正常情况下，锁定会在任务完成后立即释放。
 */
@Component
@Slf4j
public class TaskJob {
    @Resource
    private BankCheckBillService bankCheckBillService;

    /**
     * 预审并发送，凌晨7时执行
     */
    @Scheduled(cron = "${task.autoCheck:-}")
    @SchedulerLock(name = "Task-AutoCheck", lockAtLeastFor = "PT1H", lockAtMostFor = "PT10H")
    public void autoCheck() {
        log.info("【自动预审】开始执行，{}", GTimeUtil.getDateTimeMark());
        long n = System.currentTimeMillis();

        bankCheckBillService.autoCheck();

        n = (System.currentTimeMillis() - n) / 1000;
        log.info("【自动预审】执行完毕，耗时{}秒，{}", n, GTimeUtil.getDateTimeMark());
    }

    /**
     * 清理数据，清理财政消息
     */
    @Scheduled(cron = "${task.clearData:-}")
    @SchedulerLock(name = "Task-ClearData", lockAtLeastFor = "PT1H", lockAtMostFor = "PT10H")
    public void clearData() {
        log.info("【数据清理】开始执行，{}", GTimeUtil.getDateTimeMark());
        long n = System.currentTimeMillis();
        n = (System.currentTimeMillis() - n) / 1000;
        log.info("【数据清理】执行完毕，耗时{}秒，{}", n, GTimeUtil.getDateTimeMark());
    }
}
